package com.liming.stock.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.liming.common.pojo.dto.stock.InitStockDTO;
import com.liming.common.pojo.dto.stock.StockPageQuery;
import com.liming.common.pojo.dto.stock.UpdStockQuantityDTO;
import com.liming.common.pojo.entity.stock.Stock;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.stock.StockVO;

import java.util.Map;

/**
 * @author liming
 * @date 2025/1/21
 */
public interface StockMircoService extends IService<Stock> {

    /**
     * 查询库存列表
     *
     * @return 库存列表
     */
    PageVO<StockVO> page(StockPageQuery query);

    /**
     * 新增库存记录
     *
     * @param initStockDTO 新增库存记录DTO
     * @return 新增库存记录结果
     */
    Boolean initStock(InitStockDTO initStockDTO);

    /**
     * 获取商品可用库存数量
     *
     * @param productId 商品ID
     * @return 可用库存数量
     */
    Integer getAvailableQuantity(Long productId);

    /**
     * 修改 - 总库存数量 & 预警库存数量
     *
     * @param updStockQuantityDTO 修改参数
     * @return 修改结果
     */
    Boolean updStockQuantity(UpdStockQuantityDTO updStockQuantityDTO);

    /**
     * 修改 - 库存状态
     *
     * @param id 库存ID
     * @return 修改结果
     */
    Boolean updStatus(Long id);

    /**
     * 更新 - 出库
     *
     * @param id       库存ID
     * @param quantity 数量
     * @return 更新结果
     */
    Boolean out(Long id, Integer quantity);

    /**
     * 库存预警数量
     *
     * @return 库存预警数量
     */
    Long alertStockCount();

    /**
     * 所有商品可用库存数量
     *
     * @return 所有商品可用库存数量
     */
    Map<Long, Integer> allProductAvailableQuantityMap();

    /**
     * 锁定库存 根据 商品ID和数量 Map
     *
     * @param orderId 订单id
     * @param productIdAndQuantityMap 商品ID和数量 Map
     * @return 是否锁定成功
     */
    Boolean lockStockByProductIdAndQuantity(Long orderId, Map<Long, Integer> productIdAndQuantityMap);

    /**
     * 支付成功 扣减锁定库存 和 总库存
     *
     * @param orderId 订单id
     * @return 内部是否操作成功
     */
    Boolean paymentSuccess(Long orderId);

    /**
     * 支付成功 解锁库存 和 恢复可用库存
     *
     * @param orderId 订单id
     * @return 内部是否操作成功
     */
    Boolean paymentFailure(Long orderId);

    /**
     * 订单退款成功 - 库存恢复 新增退款流水
     *
     * @param orderId 订单ID
     */
    void refundSuccess(Long orderId);
}
